package cqrtplm.listener;

import cn.hutool.core.exceptions.ExceptionUtil;
import cn.hutool.extra.spring.SpringUtil;
import com.hustcad.plm.pdm.workflow.annotion.CustomListener;
import com.hustcad.plm.pdm.workflow.annotion.CustomListenerField;
import com.hustcad.plm.pdm.workflow.model.constant.ProcessConstant;
import com.ty.basic.session.RequestContext;
import cqrtplm.service.RTChangeNoticeService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.flowable.engine.RuntimeService;
import org.flowable.engine.delegate.DelegateExecution;
import org.flowable.engine.delegate.ExecutionListener;
import org.flowable.engine.impl.el.FixedValue;
import org.flowable.engine.runtime.Execution;

import java.math.BigInteger;
import java.util.Map;
import java.util.concurrent.CompletableFuture;

/**
 * Created by IntelliJ IDEA.
 *
 * @Author : pieStar
 * @create 2025/7/22 21:54
 */
@Slf4j
@CustomListener(category = "润通", description = "变更流程分支控制")
public class RTProcessBranchControlListener implements ExecutionListener {
    @CustomListenerField(description = "条件", defaultValue = "", required = true)
    private FixedValue condition;

    @Override
    public void notify(DelegateExecution execution) {
        long start = System.currentTimeMillis();
        String workFlowContainerId = execution.getProcessInstanceBusinessKey();
        log.info("----------润通----变更流程分支控制------开始------workFlowContainerId:{}----->>>", workFlowContainerId);
        if (StringUtils.isBlank(workFlowContainerId)) {
            workFlowContainerId = execution.getVariable(ProcessConstant.WORK_FLOW_CONTAINER_ID).toString();
        }
        String finalWorkFlowContainerId = workFlowContainerId;
        Map<String, Object> requestContext = RequestContext.currentContext();
//        CompletableFuture.runAsync(() -> {
            String branch = "";
            RequestContext.attachContext(requestContext);
            String conditionBranch = "";
            if (condition != null) {
                conditionBranch = condition.getExpressionText();
            }
            try {
                RTChangeNoticeService changeNoticeService = SpringUtil.getBean(RTChangeNoticeService.class);
                changeNoticeService.setBranchControl(new BigInteger(finalWorkFlowContainerId), conditionBranch,execution);
            } catch (Exception e) {
                log.info("获取分支节点错误：", e);
                log.error(ExceptionUtil.getMessage(e));
                log.error(ExceptionUtil.stacktraceToString(e, 100000));
            } finally {
            }
//        });
    }
}
